package gestores;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import org.omg.CORBA.DATA_CONVERSION;

//import persistence.DBManager;
import persistencia.DACBase;
import persistencia.DACNivel;
import persistencia.SingletonDACBase;
import persistencia.cliente.DACCondicion;
import persistencia.cliente.DACHerramientaInformatica;
import persistencia.cliente.DACIdioma;
import persistencia.cliente.DACPuesto;
import persistencia.cliente.DACTarea;
import persistencia.cliente.DACTipoEstudio;
import persistencia.cliente.DACTipoExigencia;
import persistencia.cv.*;

import Pantallas.AdministrarCV;


import negocio.cv.*;
import Empleados.ConsultarCandidato;

public class GestorCV {
private LinkedList<CV> cvs;
private ConsultarCandidato consultaCv;
private DAOCv daoCV;
private DAOCalle daoCalle;
private DAOBarrio daoBarrio;
private DAOProvincia daoProvincia;
private DACNivel dacNivel;
private DACCondicion dacCondicion;
private DACTarea dacTarea;
private DACHerramientaInformatica dacHerrInf;
private DACIdioma dacIdioma;
private DACTipoExigencia dacTipoExigencia;
private DACTipoEstudio dacTipoEstudio;
private DACPuesto dacPuesto;
//private DAOLocalidad daoLocalidad;
private DAONacionalidad daoNacionalidad;
private DAOEstadoCivil daoEstadoCivil;
private DAOTipoDocumento daoTiposDoc;
private LinkedList<Nacionalidad> nacionalidades;
//private LinkedList<Localidad> localidades;
private LinkedList<Barrio> barrios;
private LinkedList<Provincia> provincias;
private LinkedList<Calle> calles;
private LinkedList<EstadoCivil> estadosCiviles;
private LinkedList<TipoDocumento>tiposDocumento;
AdministrarCV adminCv;
private List<Nivel> nivelesDeEstudio;
private List<Condicion> condiciones;
private List<TipoEstudio> tiposEstudios;
private List<TipoHerramientaInformatica> tiposDeHerrsInfs;
private List<Idioma> idiomas;
private List<Nivel> nivelesDeConocimiento;
private List<Tarea> tareas;
private List<Nivel> nivelesDeExperiencia;
private List<TipoExigencia> tiposDeExigencia;
private List<Puesto> puestos;
private static GestorCV gestorCV=null;
	public GestorCV()
	{
		/*
		daoCV=new DAOCv(DBManager.getInstance());
		daoBarrio=new DAOBarrio(DBManager.getInstance());
		daoCalle=new DAOCalle(DBManager.getInstance());
		daoProvincia=new DAOProvincia(DBManager.getInstance());
		//daoLocalidad=new DAOLocalidad(DBManager.getInstance(),-1);
		daoNacionalidad=new DAONacionalidad(DBManager.getInstance());
		daoEstadoCivil=new DAOEstadoCivil(DBManager.getInstance());
		daoTiposDoc=new DAOTipoDocumento(DBManager.getInstance());
		
		dacNivel=new DACNivel(SingletonDACBase.tomarDACBase());
		dacCondicion=new DACCondicion(SingletonDACBase.tomarDACBase());
		daoTipoEstudio=new DAOTipoEstudio(DBManager.getInstance());
		*/
		
		dacNivel=new DACNivel(SingletonDACBase.tomarDACBase());
		dacCondicion=new DACCondicion(SingletonDACBase.tomarDACBase());
		dacTipoEstudio=new DACTipoEstudio(SingletonDACBase.tomarDACBase());
		SingletonDACBase.tomarDACBase().abrirConexion();
		cvs=new LinkedList<CV>();
		adminCv=new AdministrarCV(this);
		//cargarDatosInicialesPersonales();
		cargarDatosInicialesAcademicos();
		cargarDatosInicialesInformaticosEIdiomas();
		cargarDatosLaborales();
		cargarDatosOpcionales();
		adminCv.setVisible(true);
		
		
		LinkedList<Tarea> tareas=new LinkedList<Tarea>();
		Tarea t=new Tarea("Operador de maquina");
		t.setIdTarea(2);
		t.setNivelDeExperiencia(new Nivel(4,"experto","experto",4,null));
		tareas.add(t);
				

		CV curri=new CV(100,new Persona("Rodrigo","Perez",new TipoDocumento(),32685145,new Date("15/08/1980"),new Nacionalidad(),
				154587458,351,4565585,"rodrg@hotmail.com",new EstadoCivil(),"Masculino",3268514,0,0,0,false,
				"Considerar",new Domicilio()),new Date(),false,new LinkedList<ReferenciaLaboral>(),
				new LinkedList<ReferenciaEstudio>(),null,null,true,true,0,tareas);
		curri.setExigencias(new LinkedList<Exigencia>());
		curri.setIdCV(1);
		cvs.add(curri);
		///////////////////////////////////////////////
		tareas=new LinkedList<Tarea>();
		t=new Tarea("Operador de maquina");
		t.setIdTarea(2);
		t.setNivelDeExperiencia(new Nivel(1,"minimo","minimo",1,null));
		tareas.add(t);
				

		curri=new CV(100,new Persona("Rodrigo2","Perez2",new TipoDocumento(),29685145,new Date("15/08/1980"),new Nacionalidad(),
				154587458,351,4565585,"rodrg@hotmail.com",new EstadoCivil(),"Masculino",3268514,0,0,0,false,
				"Considerar",new Domicilio()),new Date(),false,new LinkedList<ReferenciaLaboral>(),
				new LinkedList<ReferenciaEstudio>(),null,null,true,true,0,tareas);
		curri.setExigencias(new LinkedList<Exigencia>());
		curri.setIdCV(2);
		cvs.add(curri);
		/////////////////////////////////////////
		tareas=new LinkedList<Tarea>();
		t=new Tarea("Operador de maquina");
		t.setIdTarea(2);
		t.setNivelDeExperiencia(new Nivel(3,"general","general",3,null));
		tareas.add(t);
				

		curri=new CV(100,new Persona("Rodrigo3","Perez3",new TipoDocumento(),28685145,new Date("15/08/1980"),new Nacionalidad(),
				154587458,351,4565585,"rodrg@hotmail.com",new EstadoCivil(),"Masculino",3268514,0,0,0,false,
				"Considerar",new Domicilio()),new Date(),false,new LinkedList<ReferenciaLaboral>(),
				new LinkedList<ReferenciaEstudio>(),null,null,true,true,0,tareas);
		curri.setExigencias(new LinkedList<Exigencia>());
		curri.setIdCV(3);
		cvs.add(curri);
			
		gestorCV=this;
	}
	
	private void cargarDatosOpcionales() {
		dacTipoExigencia = new DACTipoExigencia(SingletonDACBase.tomarDACBase());
		tiposDeExigencia = dacTipoExigencia.consultarTiposExigencias();
		adminCv.getDatosOpcionales().cargarTipoDeExigencias(tiposDeExigencia);
		
	}

	private void cargarDatosLaborales() {
		// cargo las tareas disponibles
		dacTarea = new DACTarea(SingletonDACBase.tomarDACBase());
		tareas = dacTarea.consultarTareas();
		adminCv.getDatosLaborales().cargarTareas(tareas);
		
		dacPuesto=new DACPuesto(SingletonDACBase.tomarDACBase());
		puestos=dacPuesto.consultarPuestos();
		adminCv.getDatosLaborales().cargarPuestos(puestos);
		
		//cargo los niveles de experiencia laboral 
		dacNivel = new DACNivel(SingletonDACBase.tomarDACBase());
		nivelesDeExperiencia = dacNivel.consultarNiveles("tarea");
		adminCv.getDatosLaborales().cargarNivelesDeTarea(nivelesDeExperiencia);
		
	}

	private void cargarDatosInicialesInformaticosEIdiomas() {
		dacHerrInf = new DACHerramientaInformatica(SingletonDACBase.tomarDACBase());
		tiposDeHerrsInfs = dacHerrInf.consultarTipoHerramientaInformatica();
		adminCv.getDatosInformaticos().cargarHerramientasInformaticas(tiposDeHerrsInfs);
				
		//cargo los idiomas
		dacIdioma = new DACIdioma(SingletonDACBase.tomarDACBase());
		idiomas = dacIdioma.consultarIdiomas();
		adminCv.getDatosInformaticos().cargarIdiomas(idiomas);
		
		//cargo niveles de conocimiento
		dacNivel = new DACNivel(SingletonDACBase.tomarDACBase());
		nivelesDeConocimiento = dacNivel.consultarNiveles("conocimiento");
		adminCv.getDatosInformaticos().cargarNivelesDeConocimiento(nivelesDeConocimiento);	
		
	}

	private void cargarDatosInicialesAcademicos() {
		nivelesDeEstudio = dacNivel.consultarNiveles("estudio");
		condiciones = dacCondicion.consultarCondiciones();
		tiposEstudios = dacTipoEstudio.consultarTiposDeEstudio();
		
		adminCv.getDatosAcademicos().cargarTiposDeEstudio(tiposEstudios);
		adminCv.getDatosAcademicos().cargarNivelesDeEstudio(nivelesDeEstudio);
		adminCv.getDatosAcademicos().cargarCondiciones(condiciones);
		
	}

	private void cargarDatosInicialesPersonales() {
		barrios=daoBarrio.getAll();
		tiposDocumento=daoTiposDoc.getAll();
		estadosCiviles=daoEstadoCivil.getAll();
		nacionalidades=daoNacionalidad.getAll();
		calles=daoCalle.getAll();
		provincias=daoProvincia.getAll();			
		adminCv.getDatosPersonales().setBarrios(barrios);
		adminCv.getDatosPersonales().setTiposDocumento(tiposDocumento);
		adminCv.getDatosPersonales().setEstadosCiviles(estadosCiviles);
		adminCv.getDatosPersonales().setNacionalidades(nacionalidades);
		adminCv.getDatosPersonales().setCalles(calles);
		adminCv.getDatosPersonales().setProvincias(provincias);	
		
	}

	
	
	
	public boolean guardarCV(Persona persona,int numeroCV, LinkedList<ConocimientoIdioma> idiomas,
								LinkedList<ReferenciaEstudio> referenciasEstudio,float remuneracion,String observaciones,LinkedList<Exigencia> exigencias,
								LinkedList<ReferenciaLaboral> referenciasLaborales, LinkedList<Tarea> tareas,
								LinkedList<HerramientaInformatica>herramientas,String pathFoto, boolean fullTime, String horarioPart)
	{
		CV cv=new CV();
		cv.setNumeroUbicacion(numeroCV);
		cv.setPersona(persona);
		cv.setReferenciasEstudio(referenciasEstudio);
		cv.setReferenciasLaborales(referenciasLaborales);
		cv.setTareas(tareas);
		cv.setRemunPretendioda(remuneracion);
		cv.setObservacion(observaciones);
		cv.setFechaRecepcion(new Date());
		cv.setExigencias(exigencias);
		cv.setIdiomas(idiomas);
		cv.setHerramientasInformaticas(herramientas);
		
		cv.setPathFoto(pathFoto);
		cv.setDisponibFullPart(fullTime);
		cv.setHorarioPartTime(horarioPart);
		cv.setIdCV(daoCV.insert(cv));
		
		cvs.add(cv);
		return true;
		
		
	}

	public LinkedList<CV> getCvs() {
		return cvs;
	}

	public static GestorCV getInstance() {
		return gestorCV;
	}

	public void consultarCV() {
		/*consultaCv=new ConsultarCandidato(this,ConsultarCandidato.CONSULTAR_CV);
		consultaCv.setVisible(true);*/
		
	}

	/**
	 * Busca un CV filtrando por DNI o Nombre.
	 * @param dni
	 */
	public String[][] consultarCV(String data,boolean isDni) {
	String [][] tabla=null;	
	ArrayList<CV> encontrados=new ArrayList<CV>();
	int dni=isDni?Integer.parseInt(data):0;
	if(isDni)
	{
		for(CV cv: cvs)
	
		{
			if(cv.esMiDNI(dni))
			{
				encontrados.add(cv);
				break;
			}
		}
	}
	else{
		for(CV cv: cvs)
		{
			if(cv.esParteDeNombreOApellido(data))
				encontrados.add(cv);
		}
	}
	if(encontrados.size()>0)
	{
		tabla=new String[encontrados.size()][4];
	
		ComparaNombres comparaNombres=new ComparaNombres();
		Collections.sort(encontrados,comparaNombres);
	for (int i=0;i<encontrados.size();i++)
	{		
		tabla[i][0]=String.valueOf(encontrados.get(i).getPersona().getNroDocumento());
		tabla[i][1]=encontrados.get(i).getApellidoYNombre();
		tabla[i][2]=encontrados.get(i).getFechaRecepcion().toString();
		tabla[i][3]=encontrados.get(i).getObservacion();
	}
	
	}
	return tabla;
	}
	
	public Idioma devolverIdioma(int posIdioma){
		return idiomas.get(posIdioma);
	}
	
	class ComparaNombres implements Comparator<CV>
	{
		//@Override
		public int compare(CV o1, CV o2) {
			return o1.getPersona().getApellido().compareTo(o2.getPersona().getApellido());
		}

		
		
	}

}
